import 'package:after_sale_plugin/package_data_center.dart';
import 'package:after_sale_plugin/package_event.dart';
import 'package:after_sale_plugin/routes.dart';
import 'package:get/get.dart';
import 'package:lx_widgets_library/lx_widgets_library.dart';
import 'package:shared_preferences/shared_preferences.dart';

// 事件回调，用于处理无返回值的事件
typedef EventCallBack = void Function(dynamic);

// 带返回值的事件回调，用于处理有返回值的事件
typedef EventCallBackWithResponse = void Function(
  AfterSalePluginActionEnum, // 事件类型枚举
  dynamic, // 事件数据
  EventCallBack, // 回调函数
);

// 路由枚举，定义了插件的不同路由及其对应的路径
enum AfterSalePluginRouteEnum {
  clickForService(0, Routes.editOrder), // 点击服务
  orderHistory(1, Routes.historyList), // 订单历史
  orderDetail(2, Routes.orderDetail), // 订单详情
  productManual(3, Routes.productManual), // 产品手册
  vehicleGuide(4, Routes.productManual); // 车辆指南

  final int rawValue; // 枚举的原始值
  final String name; // 枚举的名称
  const AfterSalePluginRouteEnum(this.rawValue, this.name);
}

// 包桥梁 - 模型，用于管理插件的路由和事件回调
class AfterSalePluginBridge extends GetxService {
  // 标识插件是否单独运行
  bool isRunAlone = true;

  // 获取 AfterSalePluginBridge 实例的单例方法
  static AfterSalePluginBridge get to {
    _initServices(); // 初始化服务
    return Get.find(); // 返回已注册的实例
  }

  // 初始化服务，用于在插件启动时进行必要的初始化操作
  static Future<void> _initServices() async {
    Get.put(SharedPreferencesService());
  }

  // 插件的路由列表
  List<GetPage> get routes => AfterSalePages.routes;

  // 事件回调，用于处理从插件返回的事件
  EventCallBackWithResponse? callBackToApp;

  // App - 跳转插件页面，用于从主应用跳转到插件的指定页面
  String routeTo(
    AfterSalePluginRouteEnum routeEnum, // 目标路由枚举
    EventCallBackWithResponse? callback, // 事件回调函数
    {
    Map<dynamic, dynamic>? arguments, // 传递给页面的参数
  }) {
    if (arguments != null) {
      // 如果存在参数，将其解析并存储到数据中心
      PackageDataCenter.fromMap(arguments);
    }
    isRunAlone = false; // 标记插件不再单独运行
    if (callback == null) {
      throw ArgumentError('函数回调未实现'); // 如果回调函数未实现，抛出异常
    } else {
      callBackToApp = callback; // 存储回调函数
    }
    return routeEnum.name; // 返回目标路由的名称
  }
}
